/**
 * Baco OPC - Baco Sistemas corp.
 */
package bacoopc;

import bacoopc.excecoes.ExcecaoBacoOpc;
import bacoopc.excecoes.ExcecaoConexaoOPC;
import bacoopc.gui.entidades.AlgoritmoInterface;
import bacoopc.gui.entidades.ProjetoInterface;
import bacoopc.gui.entidades.ServidorInterface;
import bacoopc.persistencia.DAOBacoOpc;
import bacoopc.persistencia.PersistenciaServidorOPC;
import java.util.ArrayList;
import java.util.List;

/**
 * TODO documentação
 * @author Baco Sistemas
 */
public class BacoOPC {

    /** Lista de projetos da interface */
    private List<Projeto> projetos ;

    /** Conexexões OPC ativas */
    private List<ConexaoOPC> conexoesOpc ;

    private static BacoOPC controlador = null ;

    public static BacoOPC getInstance() {
        if ( controlador == null ) {
            BacoOPC.controlador = new BacoOPC() ;
        }
        return BacoOPC.controlador ;
    }

    private BacoOPC() {
        this.projetos = new ArrayList<Projeto>();
        this.conexoesOpc = new ArrayList<ConexaoOPC>();
    }

    /**
     * Adiciona um novo projeto à lista
     *
     * @param name o nome do novo projeto
     * @param dataCriacao data da criação do projeto
     */
    // TODO mudar a implementação desse método para receber um ProjetoInterface
    public void adicionarNovoProjeto(String name, String autor)
            throws ExcecaoBacoOpc {
        Projeto novoProjeto = new Projeto( name , autor , 1000); // TODO definir taxa de execução
        projetos.add( novoProjeto ) ;
        DAOBacoOpc.getInstance().adicionar( novoProjeto );
    }

    // TODO mudar a implementação desses métodos para receberem um ServidorInterface
    public void adicionarNovoServidorOpc(String name, String url) throws
            ExcecaoConexaoOPC {
        ConexaoOPC conexaoOPC = new ConexaoOPC(url, name) ;

        // T0D0 checar se o nome do servidor OPC já existe antes de inserir no banco
        DAOBacoOpc.getInstance().adicionar(conexaoOPC);
    }

    /**
     * Adiciona um novo algoritmo de controle no Banco de Dados
     *
     * @param novo o novo algoritmo de controle a ser adicionado
     */
    public void adicionarNovoAlgoritmo( AlgoritmoInterface novo ) {
        DAOBacoOpc.getInstance().adicionar( novo );
    }

    /**
     * Retorna todos os nomes dos projetos do anc
     *
     * @return
     */
    public List< ProjetoInterface > listarProjetos() throws ExcecaoBacoOpc {
        return DAOBacoOpc.getInstance().getProjetos() ;
    }

    /**
     * Lista os servidores OPC anexados a um projeto
     *
     * @param proj o projeto
     * @return
     */
//    public List< ServidorInterface > listarServidores( ProjetoInterface proj ) {
//
//    }

    /**
     * Mapeia um projeto em um utilizado pela interface
     *
     * @param proj O projeto intern$o de um programa
     * @return proj O objeto manipulado pela interface
     */
//
    protected ProjetoInterface mapearProjeto( Projeto proj ) {
//        //ProjetoInterface result = new ProjetoInterface(proj.getNome(), true) ;
//        return result ;
        return null ;
    }

    public List<ConexaoOPC> getConexoesOpc() {
        return conexoesOpc;
    }

    public void setConexoesOpc(List<ConexaoOPC> conexoesOpc) {
        this.conexoesOpc = conexoesOpc;
    }

    public List<Projeto> getProjetos() {
        return projetos;
    }

    public void setProjetos(List<Projeto> projetos) {
        this.projetos = projetos;
    }

    void executarProjeto() {
        // TODO implementar
    }
}
